home *** CD-ROM | disk | FTP | other *** search
/ Stone Design / Stone Design.iso / Stone_Friends / Wave / WavesWorld / Source / IBPalettes / WWTCLKit / WWTTSwitchView.m < prev    next >
Encoding:
Text File  |  1995-03-22  |  4.0 KB  |  208 lines

  1. /* SwitchView.m
  2.  * Written By:  Thomas Burkholder
  3.  *
  4.  * You may freely copy, distribute, and reuse the code in this example.
  5.  * NeXT disclaims any warranty of any kind, expressed or  implied, as to its
  6.  * fitness for any particular use.
  7.  */
  8.  
  9. // name space protected for WavesWorld by the addition of the "WWTT" prefix
  10.  
  11.  
  12. #import "WWTTSwitchView.h"
  13. #import <apps/InterfaceBuilder.h>
  14.  
  15. @implementation WWTTSwitchView
  16.  
  17. + initialize { return [WWTTSwitchView setVersion:2], self; }
  18.  
  19. - initFrame:(const NXRect *)frameRect
  20. {
  21.     [super initFrame:frameRect];
  22.     [self setTitle:"WWTTSwitchView"];
  23.     views = [[List alloc] init];
  24.     valueSelector = (SEL)0;
  25.     initialViewNumber = 0;
  26.     currentViewNumber = -1;
  27.     return self;
  28. }
  29.  
  30. - free
  31. {
  32.     [views free];
  33.     return [super free];
  34. }
  35.  
  36. - awakeFromNib
  37. {
  38.     [self setViewNumber:initialViewNumber];
  39.     return self;
  40. }
  41.  
  42. - setViewNumber:(int)ndx
  43. {
  44.     id old, v = [views objectAt:ndx];
  45.  
  46.     if (!v) return self;
  47.     old = [self setContentView:v];
  48.     if (NX_NOT_IN_LIST == [views indexOf:old]) {
  49.         [old free];
  50.     }
  51.     currentViewNumber = ndx;
  52.     return self;
  53. }
  54.  
  55. - views
  56. {
  57.     return views;
  58. }
  59.  
  60. - takeViewNumberFrom:sender
  61. {
  62.     int i;
  63.     SEL vs;
  64.  
  65.     if (!valueSelector && sender)
  66.         vs = [self guessValueSelectorForSwitchSource:sender];
  67.     else
  68.         vs = valueSelector;
  69.  
  70.     i = (int)[sender perform:vs];
  71.     [self setViewNumber:i];
  72.     [self display];
  73.     return self;
  74. }
  75.  
  76. - takeTagFrom:sender
  77. {
  78.     int i;
  79.  
  80.  
  81.         // wave stuck me in cause this makes more sense...
  82.         if ([sender respondsTo:@selector(selectedCell)])  /* it's a Matrix */
  83.         {  i = [[sender selectedCell] tag];
  84.         }
  85.         else
  86.         {  i = [sender tag];
  87.         }
  88.     [self setViewNumber:i];
  89.     [self display];
  90.     return self;
  91. }
  92.  
  93. - takeIntValueFrom:sender
  94. {
  95.     [self setViewNumber:[sender intValue]];
  96.     [self display];
  97.     return self;
  98. }
  99.  
  100. - takeSelectedRowFrom:sender
  101. {
  102.     [self setViewNumber:[sender selectedRow]];
  103.     [self display];
  104.     return self;
  105. }
  106.  
  107. - takeSelectedColFrom:sender
  108. {
  109.     [self setViewNumber:[sender selectedCol]];
  110.     [self display];
  111.     return self;
  112. }
  113.  
  114.  
  115. - setValueSelector:(SEL)aSelector
  116. {
  117.     valueSelector = aSelector;
  118.     return self;
  119. }
  120.  
  121. - (SEL)valueSelector
  122. {
  123.     return valueSelector;
  124. }
  125.  
  126. - setInitialViewNumber:(int)num
  127. {
  128.     initialViewNumber = num;
  129.     return self;
  130. }
  131.  
  132. - (int)initialViewNumber
  133. {
  134.     return initialViewNumber;
  135. }
  136.  
  137. - (SEL)guessValueSelectorForSwitchSource:sender
  138. {
  139.     if ([sender isKindOf:[Matrix class]]) { int r, c;
  140.         [sender getNumRows:&r numCols:&c];
  141.         if (r >= c)
  142.             return @selector(selectedRow);
  143.         else
  144.             return @selector(selectedCol);
  145.     } else if ([sender respondsTo:@selector(isEditable)] &&
  146.             ([sender isEditable]) &&
  147.             ([sender respondsTo:@selector(intValue)])) {
  148.         return @selector(intValue);
  149.     } else if ([sender isKindOf:[Button class]] ||
  150.                         [sender isKindOf:[ButtonCell class]]) {
  151.         return @selector(tag);
  152.     } else if ([sender respondsTo:@selector(intValue)]) {
  153.         return @selector(intValue);
  154.     } else if ([sender respondsTo:@selector(tag)]) {
  155.         return @selector(tag);
  156.     }
  157.     return (SEL)0;
  158. }
  159.  
  160. - drawSelf:(const NXRect *)rects :(int)rectCount
  161. {
  162.     // Problem with IB not calling awakeFromNib
  163.     if (currentViewNumber == -1 && [views count] > 0) {
  164.         [self setViewNumber:initialViewNumber];
  165.     }
  166.     return [super drawSelf:rects :rectCount];
  167. }
  168.  
  169. - read:(NXTypedStream *)stream
  170. {
  171.   int  version;
  172.  
  173.  
  174.   [super read:stream];
  175.  
  176.   version = NXTypedStreamClassVersion(stream,"WWTTSwitchView");
  177.   if (version == 0)
  178.   {  NXReadType(stream,":",&valueSelector);
  179.      views = NXReadObject(stream);
  180.      currentViewNumber = -1;
  181.   }
  182.   if (version == 1)
  183.   {  NXReadType(stream,":",&valueSelector);
  184.      views = NXReadObject(stream);
  185.      NXReadType(stream,"i",&initialViewNumber);
  186.      currentViewNumber = -1;
  187.   }
  188.   if (version == 2)
  189.   {  NXReadType(stream,":",&valueSelector);
  190.      views = NXReadObject(stream);
  191.      NXReadType(stream,"i",&initialViewNumber);
  192.      NXReadType(stream,"i",¤tViewNumber);
  193.   }
  194.  
  195.   return self;
  196. }
  197.  
  198. - write:(NXTypedStream *)stream
  199. {
  200.     [super write:stream];
  201.     NXWriteType(stream,":",&valueSelector);
  202.     NXWriteObject(stream,views);
  203.     NXWriteType(stream,"i",&initialViewNumber);
  204.     NXWriteType(stream,"i",¤tViewNumber);
  205.     return self;
  206. }
  207. @end
  208.